const GZHConfig = require("../gzhConfig");
const CryptoJS = require("crypto-js");
const { DataFormatter } = require("utils");
function decodeEncrypt(encrypt) {
    // base64
    const key = Buffer.from(GZHConfig.AESKey + "=", "base64");
    // 提取前 16 字节作为 IV
    const iv = key.subarray(0, 16);
    // 先对密文进行 Base64 解码
    const encryptedBytes = CryptoJS.enc.Base64.parse(encrypt);

    // 使用 AES 解密消息
    // AES 采用 CBC 模式，秘钥长度为 32 个字节（256 位），数据采用 PKCS#7 填充
    const decrypted = CryptoJS.AES.decrypt(
        {
            ciphertext: encryptedBytes,
        },
        CryptoJS.lib.WordArray.create(key),
        {
            iv: CryptoJS.lib.WordArray.create(iv),
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
        }
    );

    /* 
    构造FullStr=random(16B) + msg_len(4B) + msg + appid，其中
        random(16B)为 16 字节的随机字符串；
        msg_len 为 msg 长度，占 4 个字节(网络字节序)；
        msg为明文；
        appid为公众号Appid
    */

    const FullStrPartLength = {
        random: 16,
        msgLen: 4,
    };

    // utf8
    let FullStr = decrypted.toString(CryptoJS.enc.Utf8);
    // 转buffer 截取
    let finalBuff = Buffer.from(FullStr, "utf-8");

    // 截取前 16 字节的随机字符串
    const randomString = finalBuff.subarray(0, FullStrPartLength.random).toString("utf8");

    // 截取接下来的 4 字节并转换为消息长度
    const msgLenBuffer = finalBuff.subarray(
        FullStrPartLength.random,
        FullStrPartLength.random + FullStrPartLength.msgLen
    );
    // 用的是大端
    let msgLength = msgLenBuffer.readInt32BE();
    // 取出内容
    let contentMsg = finalBuff
        .subarray(
            FullStrPartLength.random + FullStrPartLength.msgLen,
            FullStrPartLength.random + FullStrPartLength.msgLen + msgLength
        )
        .toString("utf8");

    // 剩余部分为 AppID
    const appId = finalBuff
        .subarray(FullStrPartLength.random + FullStrPartLength.msgLen + msgLength)
        .toString("utf8");

    return {
        appId,
        random: randomString,
        //  contentMsg是 xml的
        content: DataFormatter.xml(contentMsg),
    };
}

module.exports = {
    decodeEncrypt,
};
